package com.lifesea.notify.utils;

import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;

/**
 * <p>  </p>
 * User: chendw
 * Date: 2016/10/18 10:52
 */
public class RandomUtils {
    private static Random random;

    //双重校验锁获取一个Random单例
    public static Random getRandom() {
        if (random == null) {
            synchronized (RandomUtils.class) {
                if (random == null) {
                    random = new Random();
                }
            }
        }

        return random;
    }

    /**
     * 获得一个[0,max)之间的整数。
     *
     * @param max
     * @return
     */
    public static int getRandomInt(int max) {
        return Math.abs(getRandom().nextInt()) % max;
    }

    /**
     * 获得一个[0,max)之间的整数。
     *
     * @param max
     * @return
     */
    public static long getRandomLong(long max) {
        return Math.abs(getRandom().nextInt()) % max;
    }

    /**
     * 从list中随机取得一个元素
     *
     * @param list
     * @return
     */
    public static <e> e getRandomElement(List<e> list) {
        return list.get(getRandomInt(list.size()));
    }

    /**
     * 从set中随机取得一个元素
     *
     * @param set
     * @return
     */
    public static <e> e getRandomElement(Set<e> set) {
        int rn = getRandomInt(set.size());
        int i = 0;
        for (e e : set) {
            if (i == rn) {
                return e;
            }
            i++;
        }
        return null;
    }

    /**
     * 从map中随机取得一个key
     *
     * @param map
     * @return
     */
    public static <k, v> k getRandomKeyFromMap(Map<k, v> map) {
        int rn = getRandomInt(map.size());
        int i = 0;
        for (k key : map.keySet()) {
            if (i == rn) {
                return key;
            }
            i++;
        }
        return null;
    }

    /**
     * 从map中随机取得一个value
     *
     * @param map
     * @return
     */
    public static <k, v> v getRandomValueFromMap(Map<k, v> map) {
        int rn = getRandomInt(map.size());
        int i = 0;
        for (v value : map.values()) {
            if (i == rn) {
                return value;
            }
            i++;
        }
        return null;
    }

}